//配置路由的方法
import Vue from 'vue'
import VueRouter from 'vue-router'
import routes from '@/router/routes'
import store from '@/store'
//使用插件
Vue.use(VueRouter)

//先把VueRouter原型对象的push，先保存一份
let originPush = VueRouter.prototype.push;
let originReplace = VueRouter.prototype.replace;

//重写push | replace
//第一个参数：告诉原来的push方法，你往哪里跳转（传递哪些参数）
VueRouter.prototype.push = function (location, resolve, reject) {
    if (resolve && reject) {
        //call || apply区别：
        // 相同点，都可以调用函数一次，都可以篡改函数的上下文一次
        //不同点：call与apply传递参数：call传递参数用逗号隔开，apply方法执行，传递数组
        originPush.call(this, location, resolve, reject);
    } else {
        originPush.call(this, location, () => { }, () => { })
    }
}

VueRouter.prototype.replace = function (location, resolve, reject) {
    if (resolve && reject) {
        originReplace.call(this, location, resolve, reject);
    } else {
        originReplace.call(this, location, () => { }, () => { })
    }
}


//配置路由
let router = new VueRouter({
    // key:value 一致省略value  （ routes: routes）
    routes,
    scrollBehavior(to, from, savedPosition) {
        // return 期望滚动到哪个的位置 (返回的y：0 表示在页面最上方 x:0 代表水平方向的位置)
        return { y: 100 }
    }
});

// 全局守卫（前置首位） 在路由跳转前进行判断
router.beforeEach(async (to, from, next) => {
    // to:可以获取到你要跳转到哪个路由信息
    // from:可以获取到你从哪个路由来的信息
    // next:放行函数  next()放行  next(path)放行到指定路由       next(false)
    // 为了测试全都放行
    // console.log(next);
    // next();
    // 用户登录了，才会有token，未登录一定不会有token
    let token = store.state.user.token;
    // 用户信息
    let name = store.state.user.userInfo.name;
    // console.log(userInfo);
    // 用户已经登陆了
    if (token) {
        // 用户已经登陆了还想去login休想
        if (to.path == '/login' || to.path == '/register') {
            next('/home');
        } else {
            // 登录了但是去的不是login【home,search,detail,shopcart】
            // 如果用户名已有
            if (name) {
                next();
            } else {
                // 没有用户信息,派发action让仓库存储用户信息再跳转
                // 获取用户信息在首页展示
                try {
                    // 获取用户信息成功
                    await store.dispatch("getUseInfo");
                    next();
                } catch (error) {
                    // token失效了获取不到用户的信息，重新登录
                    await store.dispatch('userLogout');
                    next('/login');
                    // 清除token
                }

            }

        }
    }
    else {
        // 用户未登录:不能去交易相关、不能去支付相关【pay | paysuccess】、不能去个人中心
        // 应该跳转到登录页
        // 去的不是上面这些路由（home|search|shopcart） --放行
        let toPath = to.path;
        if (toPath.indexOf('/trade') != -1 || toPath.indexOf('/pay') != -1 || toPath.indexOf('/center') != -1) {
            // if (toPath == '/trade') {
            // 把未登录时想去而没有去的页面信息，存储在地址栏（路由）当中
            next('/login?redirect=' + toPath);
        } else {
            // 去的不是上面这些路由 （home|search|shopcart）  --放行
            next();
        }

    }
});


export default router;

